
#include <base.h>
#include <base/seff.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
/* DEF填空也是一种输入依赖 */
/* DEF只能填入函数, intf */
/* DEF填入一切需要的(变量?(是否需要整为函数), 以及打包intf)*/
/* DEF统一填函数 -> 输出一套接口 */

/* CEFF有没有必要? -> 用于封装一部分接口，防止内部接口参数过多*/

#define __MEFF__(modulename)    modulename##_chdl_t *hdl;


/* 声明模块接口 */
typedef struct test_module_intf{
    word_t (*test)(word_t size);
}test_module_intf_t;

static inline __attribute__((unused))
word_t test_input(word_t size){
	(void)size;
	return 1;
}


/* 这种方式可能比较直观 */
/* 声明组件 */
STA_INFUN(modulea)
word_t (* const test_input)(word_t size);
END_INFUN(modulea)

STA_OUFUN(modulea)
word_t (* const outf1)(word_t size);
END_OUFUN(modulea)

/* 使用外部依赖函数 */
static inline __attribute__((unused))
word_t _modulea_outf1(word_t size, INFUN(modulea, f)){
	return f->test_input(size) + 1;
}

#define OUTFUN_modulea(name)		name##_outf1
/* 定义comp */
#define NEW_modulea(name, testinputf)	\
NEW_INFUN(modulea, name, testinputf)	\
static inline __attribute__((unused))	\
word_t name##_outf1(word_t size){ return _modulea_outf1(size, INFUN_OF(name)); }\
NEW_OUFUN(modulea, name, name##_outf1)

//  testaaa_oufun.outf1
NEW_modulea(testaaa, test_input)
NEW_modulea(testbbb, testaaa_outf1)

/*
    // 如果依赖节点是静态的 (编译时组合)
    // 如果是依赖节点是动态的 (反射)
    // 输入SEFF依赖         // 输出接口打包
    CEFF1=] +--------------+  
    CEFF2=] |    module    |
    CEFF3=] +--------------+
*/


int main(){
	assert(testaaa_outf1(0) == 2);
	assert(testaaa_oufun.outf1(0) == 2);
	assert(testbbb_outf1(0) == 3);
	assert(testbbb_oufun.outf1(0) == 3);

}
